////#include <iostream>
////#include <cstring>
////#include <algorithm>
////using namespace std;
////
////const int N = 1e5 + 10;
////int a[N], son[31 * N][2];
////int n, ans, idx;
////
////void insert(int x)
////{
////    int p = 0;
////    for (int i = 30; i >= 0; i--)
////    {
////        int u = x >> i & 1;
////        if (!son[p][u])son[p][u] = ++idx;
////        p = son[p][u];
////    }
////}
////
////int search(int x)
////{
////    int p = 0, res = 0;
////    for (int i = 30; i >= 0; i--)
////    {
////        int u = x >> i & 1;
////        if (son[p][!u])
////        {
////            res = res * 2 + !u;
////            p = son[p][!u];
////        }
////        else
////        {
////            res = res * 2 + u;
////            p = son[p][u];
////        }
////    }
////    return res;
////}
////
////int main()
////{
////    cin >> n;
////    for (int i = 0; i < n; i++)cin >> a[i], insert(a[i]);
////    for (int i = 0; i < n; i++)ans = max(ans, a[i] ^ search(a[i]));
////    cout << ans;
////    return 0;
////}
//#include<iostream>
//using namespace std;
//#include<unordered_map>
//const int N = 1010;
//int a[N];
//unordered_map<int, int>mp;
//int n = 0;
//int main()
//{
//	ios::sync_with_stdio(false);
//	cin.tie(0);
//	cin >> n;
//	for (int i = 0; i < n; i++)
//	{
//		cin >> a[i];
//		mp[a[i]]++;
//	}
//	int _max = 0;
//	for (auto item : mp) {
//		_max = max(_max, item.second);
//	}
//	for (auto item : mp) {
//		if (item.second == _max)
//		{
//			cout << item.second;
//			break;
//		}
//	}
//	return 0;
//}
//#include<iostream>
//using namespace std;
//const int N = 1e5 + 10, P = 131;
//char str[N];
//typedef unsigned long long ULL;
//ULL h[N], p[N];
//int n, m;
//ULL get_hash(int l, int r)
//{
//    return h[r] - h[l - 1] * p[r - l + 1];
//}
//
//int main()
//{
//    cin >> n >> m;
//    cin >> str + 1;
//    p[0] = 1;
//    h[0] = 0;
//    for (int i = 1; i <= n; i++)
//    {
//        p[i] = p[i - 1] * P;
//        h[i] = h[i - 1] * P + str[i];
//    }
//
//    while (m--) {
//        int l1, r1, l2, r2;
//        cin >> l1 >> r1 >> l2 >> r2;
//        if (get_hash(l1, r1) == get_hash(l2, r2))cout << "Yes" << endl;
//        else cout << "No" << endl;
//    }
//    return 0;
//}
//#include<iostream>
//using namespace std;
//
//const int N = 1e5 + 10;
//int p[N];
//int n, m;
//
//int find(int x)
//{
//    while (p[x] != x)p[x] = find(p[x]);
//    return p[x];
//}
//
//int main()
//{
//    ios::sync_with_stdio(false);
//    cin.tie(nullptr);
//    cin >> n >> m;
//    for (int i = 1; i <= n; i++)p[i] = i;
//
//    while (m--)
//    {
//        char op[2];
//        int a, b;
//        cin >> op >> a >> b;
//        if (op[0] == 'M')p[find(b)] = find(a);
//        else
//        {
//            if (find(a) == find(b))cout << "Yes" << endl;
//            else cout << "No" << endl;
//        }
//    }
//    return 0;
//}
//#include<iostream>
//#include<cstring>
//#include <queue>
//
//using namespace std;
//const int N = 150010;
//typedef pair<int, int> PII;
//
//int dist[N];
//int h[N], w[N], e[N], ne[N], idx;
//bool st[N];
//int n, m;
//void add(int a, int b, int c)
//{
//    w[idx] = c, e[idx] = b, ne[idx] = h[a], h[a] = idx++;
//}
//
//int dijstra()
//{
//    memset(dist, 0x3f, sizeof dist);
//    dist[1] = 0;
//    priority_queue<PII, vector<PII>, greater<PII>>heap;
//    heap.push({ 0,1 });
//    while (heap.size())
//    {
//        auto t = heap.top();
//        heap.pop();
//        int ver = t.second, distance = t.first;
//        if (st[ver])continue;
//        st[ver] = true;
//        for (int i = h[ver]; i != -1; i = ne[i])
//        {
//            int j = e[i];
//            dist[j] = min(dist[j], distance + w[i]);
//            heap.push({ dist[j],j });
//        }
//    }
//    if (dist[n] == 0x3f3f3f3f)return -1;
//    else return dist[n];
//}
//
//int main()
//{
//    ios::sync_with_stdio(false);
//    cin.tie(0);
//    memset(h, -1, sizeof h);
//    cin >> n >> m;
//    while (m--) {
//        int a, b, c;
//        cin >> a >> b >> c;
//        add(a, b, c);
//    }
//    cout << dijstra();
//    return 0;
//}

#include<iostream>
using namespace std;
#include<cstring>
#include <queue>

const int N = 1e5 + 10;
int h[N], e[N], ne[N], w[N], idx;
int dist[N];
bool st[N];
int n, m;
void add(int a, int b, int c)
{
    e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx++;
}

int spfa()
{
    memset(dist, 0x3f, sizeof dist);
    dist[1] = 0;
    queue<int>q;
    q.push(1);
    st[1] = true;

    while (q.size())
    {
        int t = q.front();
        q.pop();
        st[t] = false;
        for (int i = h[t]; i != -1; i = ne[i])
        {
            int j = e[i];
            if (dist[j] > dist[t] + w[i])
            {
                dist[j] = dist[t] + w[i];
                if (!st[j])
                {
                    q.push(j);
                    st[j] = true;
                }
            }
        }
    }
    return dist[n];
}

int main()
{
    memset(h, -1, sizeof h);
    cin >> n >> m;
    while (m--) {
        int a, b, c;
        cin >> a >> b >> c;
        add(a, b, c);
    }
    int ret = spfa();
    if (ret == 0x3f3f3f3f)cout << "impossible";
    else cout << ret;
    return 0;
}